/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.pnp.despachadores;

import java.io.*;
import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import pe.gob.pnp.actions.*;
import pe.gob.pnp.factories.*;

/**
 *
 * @author Eduardo Cavero Guzmán
 * @date 28/03/2010
 */
public class TipoDocumentoDespachador {

    public static List<TipoDocumento> obtenerTiposDocumento() throws SQLException {
        List<TipoDocumento> lstTipos = new ArrayList<TipoDocumento>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_TIPODOCUMENTO(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                TipoDocumento tipo = new TipoDocumento();
                tipo.setNtidoIdentificador(rs.getInt("NTIDO_IDENTIFICADOR"));
                tipo.setDtidoFechaCreacion(rs.getTimestamp("DTIDO_FECHACREACION"));
                tipo.setCtidoDescripcion(rs.getString("CTIDO_DESCRIPCION"));
                lstTipos.add(tipo);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstTipos;
    }

    public static List<TipoDocumento> obtenerTiposDocumento(TipoDocumento parametro) throws SQLException {
        List<TipoDocumento> lstTipos = new ArrayList<TipoDocumento>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_TIPODOCUMENTO_REQ(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, parametro.getNtidoIdentificador());
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while (rs.next()) {
                TipoDocumento tipo = new TipoDocumento();
                tipo.setNtidoIdentificador(rs.getInt("NTIDO_IDENTIFICADOR"));
                tipo.setDtidoFechaCreacion(rs.getTimestamp("DTIDO_FECHACREACION"));
                tipo.setCtidoDescripcion(rs.getString("CTIDO_DESCRIPCION"));
                Requisito req = new Requisito();
                req.setCrequObservacion(rs.getString("CREQU_OBSERVACION"));
                tipo.setRequisito(req);
                lstTipos.add(tipo);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstTipos;
    }

    public static int agregarTipoDocumento(TipoDocumento tipo) throws SQLException {
        Connection conn = null;
        int tipoDocumento = 0;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_AGREGAR_TIPO_DOCUMENTO(?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, tipo.getCtidoDescripcion());
            cs.setInt(2, tipo.isBtidoActivo() ? 1 : 0);
            cs.setInt(3, tipo.isBtidoPerteneceExpediente() ? 1 : 0);
            cs.registerOutParameter(4, Types.INTEGER);
            cs.execute();
            tipoDocumento = cs.getInt(4);
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return tipoDocumento;
    }

    public static void modificarTipoDocumento(TipoDocumento tipo) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_MODIFICAR_TIPO_DOCUMENTO(?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, tipo.getNtidoIdentificador());
            cs.setString(2, tipo.getCtidoDescripcion());
            cs.setInt(3, tipo.isBtidoActivo() ? 1 : 0);
            cs.setInt(4, tipo.isBtidoPerteneceExpediente() ? 1 : 0);
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void eliminarTipoDocumento(TipoDocumento tipo) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_ELIMINAR_TIPODOCUMENTO(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, tipo.getNtidoIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void obtenerTipoDocumentoPorId(TipoDocumento tipo) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_TIPO_DOC_ID(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, tipo.getNtidoIdentificador());
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            if (rs.next()) {
                tipo.setCtidoDescripcion(rs.getString("CTIDO_DESCRIPCION"));
                tipo.setBtidoActivo(rs.getBoolean("BTIDO_ACTIVO"));
                tipo.setBtidoPerteneceExpediente(rs.getBoolean("BTIDO_PERTENECEEXPEDIENTE"));
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void guardarPlantilla(int ntidoIdentificador, byte[] pdf) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_GUARDAR_PLANTILLA_PDF(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, ntidoIdentificador);
            ByteArrayInputStream in = new ByteArrayInputStream(pdf);
            cs.setBinaryStream(2, in, pdf.length);
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }

    }

    public static void guardarPlantillaHTML(int ntidoIdentificador, String html) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_GUARDAR_PLANTILLA_HTML(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, ntidoIdentificador);
            ByteArrayInputStream in = new ByteArrayInputStream(html.getBytes());
            cs.setBinaryStream(2, in, html.getBytes().length);
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static byte[] obtenerPlantilla(int ntidoIdentificador) throws SQLException {
        byte[] pdf = null;
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_PLANTILLA_PDF(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, ntidoIdentificador);
            cs.registerOutParameter(2, OracleTypes.BLOB);
            cs.execute();
            Blob pdfBlob = cs.getBlob(2);
            pdf = pdfBlob.getBytes(1, (int) pdfBlob.length());
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return pdf;
    }

    public static String obtenerPlantillaHTML(int ntidoIdentificador) throws SQLException {
        String html = null;
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_PLANTILLA_HTML(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, ntidoIdentificador);
            cs.registerOutParameter(2, OracleTypes.BLOB);
            cs.execute();
            Blob htmlBlob = cs.getBlob(2);
            if (htmlBlob == null) {
                return null;
            }
            StringBuffer sb = new StringBuffer();
            BufferedReader in = new BufferedReader(new InputStreamReader(htmlBlob.getBinaryStream()));
            String linea;
            while ((linea = in.readLine()) != null) {
                sb.append(linea + "\n");
            }
            html = sb.toString();
        } catch (IOException ex) {
            throw new SQLException(ex);
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return html;
    }

    public static void guardarPlantilla(ByteArrayInputStream in, long longitud,int ntidoidentificador) throws Exception{
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "UPDATE SISMA_TIPODOCUMENTO SET BTIDO_PLANTILLA=?";
            sql += " WHERE NTIDO_IDENTIFICADOR=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setBinaryStream(1, in, (int) longitud);
            ps.setInt(2,ntidoidentificador);
            ps.executeUpdate();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            ConnectionPool.liberarConexion(conn);
            in.close();
        }
    }
}
